// 导入数据库模块，用于执行数据库操作
const db = require('../db/index');
// 导入 bcryptjs 模块，用于密码哈希和验证
const bcrypt = require('bcryptjs');
// 导入 jsonwebtoken 模块，用于生成和验证 JSON Web Tokens (JWT)
const jwt = require('jsonwebtoken');
// 导入配置文件，包含了应用程序的配置信息
const config = require('../config');


// 在路由处理程序中处理用户注册请求
// 注册用户的处理函数
// 注册新用户的处理函数
exports.register = (req, res) => {
    // 从请求体中获取管理员信息
    const adminInfo = req.body;
    // console.log(res.body);
    // 检查是否存在有效的用户名和密码
    if (!adminInfo.name) {
        // 如果用户名或密码为空，返回一个包含错误信息的 JSON 响应
        return res.json({ status: 400, message: '用户名为空' });
    }else if(!adminInfo.password){
        return res.json({status: 400, message: '密码为空'});
    }

    // 构建 SQL 查询语句，以检查用户名是否已经被注册
    const sql = `SELECT * FROM admin WHERE name = ? `;

    // 执行 SQL 查询
    db.query(sql, [adminInfo.name], (err, results) => {
        if (err) {
            // 如果查询出现错误，返回一个包含错误信息的 JSON 响应
            return res.send({
                status: 404,
                message: err.message
            });
        }

        if (results.length > 0) {
            // 如果查询结果包含行数大于零，表示用户名已被注册，返回一个 JSON 响应
            return res.status(400).json('用户名已被注册，请更改后重新注册！');
        }

        // 使用 bcrypt 对用户的密码进行加密，返回值是加密之后的密码字符串
        adminInfo.password = bcrypt.hashSync(adminInfo.password, 10);

        // 构建 SQL 查询语句，用于将新用户信息插入到数据库
        const sqlStr = 'INSERT INTO admin SET ?';

        // 执行 SQL 插入操作
        db.query(sqlStr, { name: adminInfo.name, password: adminInfo.password, identify: adminInfo.identify }, (err, results) => {
            if (err) {
                // 如果插入出现错误，返回一个包含错误信息的 JSON 响应
                return res.send({
                    status: 400,
                    message: err.message
                });
            }

            if (results.affectedRows !== 1) {
                // 如果受影响的行数不等于 1，表示注册用户失败，返回 JSON 响应
                return res.status(400).json('注册用户失败，请稍后再试');
            }

            // 返回一个 JSON 响应，表示注册成功
            res.json({
                status: 200,
                message: '注册成功',
                name: adminInfo.name,
                password: adminInfo.password,
                identify: adminInfo.identify
            });
        });
    });
}


// 登录的处理函数
exports.login = (req, res) => {
    // 从请求中获取管理员信息
    const adminInfo = req.body;
    // console.log(req.body)看看后端是否拿到数据
    // 构建 SQL 查询语句，以管理员名字为条件查询数据库
    const sql = `SELECT * FROM admin WHERE name = ?`;

    // 执行 SQL 查询
    db.query(sql, [adminInfo.name], (err, results) => {
        if (err) {
            // 如果发生错误，返回 HTTP 400 错误并将错误信息作为 JSON 响应
            return res.status(400).json(err);
        }
        if (results.length !== 1) {
            // 如果查询结果不是唯一的管理员，返回 HTTP 400 错误并指示用户不存在
            return res.status(400).json('用户不存在');
        }

        // 使用 bcrypt 比较密码哈希，验证用户名和密码是否匹配
        const compareResult = bcrypt.compareSync(adminInfo.password, results[0].password);

        if (!compareResult) {
            // 如果密码不匹配，返回 HTTP 400 错误并提示用户名或密码输入错误
            return res.status(400).json('用户名或密码输入错误，请重新输入');
        }

        // 创建一个包含管理员的部分信息（不包含密码）的对象
        const admin = {
            id: results[0].id,
            name: results[0].name,
            identify: results[0].identify
        };

        // 使用 JSON Web Token (JWT) 签发令牌
        const tokenStr = jwt.sign(admin, config.jwtSecretKey, {
            // 设置令牌有效期，这里是10个小时
            expiresIn: '10h',
        });

        // 将生成的 Token 字符串响应给客户端
        res.json({
            status: 200,
            message: '登录成功！',
            // 在服务器端直接拼接上 Bearer 的前缀以方便客户端使用 Token
            token: 'Bearer ' + tokenStr,
        });
    });
}
